package es.uem.videojuego.implent;

import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.view.Window;
import android.view.WindowManager;

import es.uem.videojuego.marco.Audio;
import es.uem.videojuego.marco.FileIO;
import es.uem.videojuego.marco.Juego;
import es.uem.videojuego.marco.Graficos;
import es.uem.videojuego.marco.Input;
import es.uem.videojuego.marco.Screen;

	
	public abstract class AndroidJuego extends Activity implements Juego {
	    AndroidFastRenderView renderView;
	    Graficos graphics;
	    Audio audio;
	    Input input;
	    FileIO fileIO;
	    Screen screen;
	    WakeLock wakeLock;

	    @Override
	    public void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);

	        requestWindowFeature(Window.FEATURE_NO_TITLE);
	        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
	                WindowManager.LayoutParams.FLAG_FULLSCREEN);

	        boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
	        int frameBufferWidth = isLandscape ? 480 : 320;
	        int frameBufferHeight = isLandscape ? 320 : 480;
	        Bitmap frameBuffer = Bitmap.createBitmap(frameBufferWidth,
	                frameBufferHeight, Config.RGB_565);
	        
	        float scaleX = (float) frameBufferWidth
	                / getWindowManager().getDefaultDisplay().getWidth();
	        float scaleY = (float) frameBufferHeight
	                / getWindowManager().getDefaultDisplay().getHeight();

	        renderView = new AndroidFastRenderView(this, frameBuffer);
	        graphics = new AndroidGraficos(getAssets(), frameBuffer);
	        fileIO = new AndroidFileIO(getAssets());
	        audio = new AndroidAudio(this);
	        input = new AndroidInput(this, renderView, scaleX, scaleY);
	        screen = getStartScreen();
	        setContentView(renderView);
	        
	        PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
	        wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "GLGame");
	    }

	    @Override
	    public void onResume() {
	        super.onResume();
	        wakeLock.acquire();
	        screen.resume();
	        renderView.resume();
	    }

	    @Override
	    public void onPause() {
	        super.onPause();
	        wakeLock.release();
	        renderView.pause();
	        screen.pause();

	        if (isFinishing())
	            screen.dispose();
	    }

	    @Override
	    public Input getInput() {
	        return input;
	    }

	    @Override
	    public FileIO getFileIO() {
	        return fileIO;
	    }

	    @Override
	    public Graficos getGraphics() {
	        return graphics;
	    }

	    @Override
	    public Audio getAudio() {
	        return audio;
	    }

	    @Override
	    public void setScreen(Screen screen) {
	        if (screen == null)
	            throw new IllegalArgumentException("Screen must not be null");

	        this.screen.pause();
	        this.screen.dispose();
	        screen.resume();
	        screen.update(0);
	        this.screen = screen;
	    }
	    
	    public Screen getCurrentScreen() {
	        return screen;
	    }
	}
	

